package com.c2b.algorithm.leetcode.base;

/**
 * <a href='https://leetcode.cn/problems/reverse-vowels-of-a-string/'>反转字符串中的元音字母(Reverse Vowels of a String)</a>
 * <p>给你一个字符串 s ，仅反转字符串中的所有元音字母，并返回结果字符串。</p>
 * <p>元音字母包括 'a'、'e'、'i'、'o'、'u'，且可能以大小写两种形式出现不止一次。</p>
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *      输入：s = "hello"
 *      输出："holle"
 *
 * 示例 2：
 *      输入：s = "leetcode"
 *      输出："leotcede"
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>1 <= s.length <= 3 * 10^5</li>
 *     <li>s 由 可打印的 ASCII 字符组成</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2022/5/20 17:22
 */
public class LC0345ReverseVowelsOfAString_S {

    static class Solution {
        public String reverseVowels(String s) {
            if (s == null || s.length() <= 1) {
                return s;
            }
            int leftIndex = 0;
            int rightIndex = s.length() - 1;
            char[] chars = s.toCharArray();
            while (leftIndex < rightIndex) {
                // 从左到右找到第一个元音字母
                while (leftIndex < rightIndex && notVowel(chars[leftIndex])) {
                    leftIndex++;
                }
                // 从右到左找到第一个元音字母
                while (leftIndex < rightIndex && notVowel(chars[rightIndex])) {
                    rightIndex--;
                }
                if (leftIndex != rightIndex) {
                    // 交换位置
                    swap(chars, leftIndex++, rightIndex--);
                }
            }
            return new String(chars);
        }

        private void swap(char[] chars, int leftIndex, int rightIndex) {
            char tempCh = chars[leftIndex];
            chars[leftIndex] = chars[rightIndex];
            chars[rightIndex] = tempCh;
        }

        /**
         * 判断当前字符是否为非元音字母。如果是返回true，否则返回false。
         */
        private boolean notVowel(char ch) {
            // 元音字母表
            return "aeiouAEIOU".indexOf(ch) < 0;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.reverseVowels("hello"));
        System.out.println(solution.reverseVowels("leetcode"));
    }

}
